package com.slipper.core.similarity;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class SimilarityUtil {
    /**
     * 计算2个文本之间的相似度
     * @param text1 文本
     * @param text2 文本
     * @return 相似度
     */
    public static Double similarity(String text1, String text2) {
        Map<String, Long> vector1 = HanLPUtil.splitWordAndFrequency(text1);
        Map<String, Long> vector2 = HanLPUtil.splitWordAndFrequency(text2);
        return CosineSimilarity.similarity(vector1, vector2);
    }

    /**
     * 对文本进行词频计算
     * @param text 文本
     * @return 词频
     */
    public static Map<String, Long> wordFrequency(String text) {
        return HanLPUtil.splitWordAndFrequency(text);
    }

    /**
     * 计算2个词频集合的相似度
     * @param vector1 词频集合
     * @param vector2 词频集合
     * @return 相似度
     */
    public static Double similarity(Map<String, Long> vector1, Map<String, Long> vector2) {
        return CosineSimilarity.similarity(vector1, vector2);
    }

    /**
     * 将相似度大于等于similarity的文本进行分组
     * @param dataList 数据列表
     * @param idProp 主键字段名
     * @param textProp 相似度文本字段名
     * @param similarity 相似度
     * @return 分组
     */
    public static <T> List<List<T>> similarity(
            List<T> dataList,
            String idProp,
            String textProp,
            double similarity) {
        return new SimilarityDealer<>(dataList, idProp, textProp, similarity).getSimilarityGroup();
    }

    public static void main(String[] args) {
        List<Person> personList = new ArrayList<>();
        personList.add(new Person("1", "张三不同意！"));
        personList.add(new Person("2", "李四不同意！"));
        personList.add(new Person("3", "李四同意！"));
        personList.add(new Person("4", "张三不想同意！"));
        System.out.println(similarity(personList, "id", "name", 0.8));
    }
}

class Person {
    private String id;
    private String name;
    public Person(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}
